package com.anyikang.volunteer.sos.volunteer.app;

import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Environment;
import android.os.Vibrator;
import android.support.multidex.MultiDexApplication;
import android.text.TextUtils;
import android.util.Log;

import com.anyikang.volunteer.sos.volunteer.R;
import com.anyikang.volunteer.sos.volunteer.app.bean.MyCurrentOrder;
import com.anyikang.volunteer.sos.volunteer.baidu.LocationService;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
import com.lzy.okhttputils.OkHttpUtils;
import com.lzy.okhttputils.cookie.store.MemoryCookieStore;
import com.lzy.okhttputils.cookie.store.PersistentCookieStore;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;

import java.io.File;
import java.util.ArrayList;

import cn.jpush.android.api.JPushInterface;

public class MyApplication extends MultiDexApplication {

    private ArrayList<Activity> activityArrayList = new ArrayList<Activity>();
    private static MyApplication instance;
    public final static String SD_PATH = Environment.getExternalStorageDirectory() + "";
    static public String userPicFilePath="";

    //定位START
    public LocationService locationService;
    public Vibrator mVibrator;
    public static  boolean isRecvingOrder = false;
    public static  boolean hasInitSuccess = false; //百度导航初始化是否成功
    String TAG = "MyApplication";
    //定位END

    @Override
    public void onCreate() {
        super.onCreate();
       //gxw- LeakCanary.install(this);
        initJpush();
        initBaiDu();  //初始化
        initImageLoader(getApplicationContext());   //初始化imageloader
        initOkHttp();                               //初始化Okhttp

    }

    private void initJpush() {

        //初始化极光推送
        JPushInterface.setDebugMode(true); 	// 设置开启日志,发布时请关闭日志
        JPushInterface.init(this);     		// 初始化 JPush
    }


    //用于位置定位
    private double mCurrentLat;
    private double mCurrentLon;
    private float mCurrentAccracy;
    boolean isFirstLoc = true; // 是否首次定位
    public static boolean isClickMyLoc = false; // 是否首次定位
    public static boolean isSkipFromTaskOrder = false; //是否由 推送的任务单 或 呼救列表跳转过来，如果是从这2个途径打开的首页，则优先移动地图中心到求救人的位置而不是我的位置

    /*****
     *
     * 定位结果回调，重写onReceiveLocation方法，可以直接拷贝如下代码到自己工程中修改
     *
     */
    private BDLocationListener mListener = new BDLocationListener() {

        @Override
        public void onReceiveLocation(BDLocation location) {
            // TODO Auto-generated method stub
            if (null != location && location.getLocType() != BDLocation.TypeServerError) {
                StringBuffer sb = new StringBuffer(256);
                sb.append("time : ");
                /**
                 * 时间也可以使用systemClock.elapsedRealtime()方法 获取的是自从开机以来，每次回调的时间；
                 * location.getTime() 是指服务端出本次结果的时间，如果位置不发生变化，则时间不变
                 */
                sb.append(location.getTime());
                sb.append("\nlocType : ");// 定位类型
                sb.append(location.getLocType());
                sb.append("\nlocType description : ");// *****对应的定位类型说明*****
                sb.append(location.getLocationDescribe());
                sb.append("\nlatitude : ");// 纬度
                sb.append(location.getLatitude());
                sb.append("\nlontitude : ");// 经度
                sb.append(location.getLongitude());
                sb.append("\nradius : ");// 半径
                sb.append(location.getRadius());
                sb.append("\nCountryCode : ");// 国家码
                sb.append(location.getCountryCode());
                sb.append("\nCountry : ");// 国家名称
                sb.append(location.getCountry());
                sb.append("\ncitycode : ");// 城市编码
                sb.append(location.getCityCode());
                sb.append("\ncity : ");// 城市
                sb.append(location.getCity());
                sb.append("\nDistrict : ");// 区
                sb.append(location.getDistrict());
                sb.append("\nStreet : ");// 街道
                sb.append(location.getStreet());
                sb.append("\naddr : ");// 地址信息
                sb.append(location.getAddrStr());
                sb.append("\nDirection(not all devices have value): ");
                sb.append(location.getDirection());// 方向
                sb.append("\nlocationdescribe: ");
                sb.append(location.getLocationDescribe());// 位置语义化信息
		/*gxw-s		sb.append("\nPoi: ");// POI信息
				if (location.getPoiList() != null && !location.getPoiList().isEmpty()) {
					for (int i = 0; i < location.getPoiList().size(); i++) {
						Poi poi = (Poi) location.getPoiList().get(i);
						sb.append(poi.getName() + ";");
					}
				}
			gxw-e*/
                if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
                    sb.append("\nspeed : ");
                    sb.append(location.getSpeed());// 速度 单位：km/h
                    sb.append("\nsatellite : ");
                    sb.append(location.getSatelliteNumber());// 卫星数目
                    sb.append("\nheight : ");
                    sb.append(location.getAltitude());// 海拔高度 单位：米
                    //gxw-sb.append("\ngps status : ");
                    //gxw-sb.append(location.getGpsAccuracyStatus());// *****gps质量判断*****
                    sb.append("\ndescribe : ");
                    sb.append("gps定位成功");
                } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
                    // 运营商信息
                    if (location.hasAltitude()) {// *****如果有海拔高度*****
                        sb.append("\nheight : ");
                        sb.append(location.getAltitude());// 单位：米
                    }
                    sb.append("\noperationers : ");// 运营商信息
                    sb.append(location.getOperators());
                    sb.append("\ndescribe : ");
                    sb.append("网络定位成功");
                } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
                    sb.append("\ndescribe : ");
                    sb.append("离线定位成功，离线定位结果也是有效的");
                } else if (location.getLocType() == BDLocation.TypeServerError) {
                    sb.append("\ndescribe : ");
                    sb.append("服务端网络定位失败，可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com，会有人追查原因");
                } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
                    sb.append("\ndescribe : ");
                    sb.append("网络不同导致定位失败，请检查网络是否通畅");
                } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
                    sb.append("\ndescribe : ");
                    sb.append("无法获取有效定位依据导致定位失败，一般是由于手机的原因，处于飞行模式下一般会造成这种结果，可以试着重启手机");
                }


                // map view 销毁后不在处理新接收的位置
                if (location == null) {

                    Log.i(TAG, "location=null");
                    return;
                }
                mCurrentLat = location.getLatitude();
                mCurrentLon = location.getLongitude();
                Log.i(TAG, "listener lat=" + mCurrentLat + ",lng=" + mCurrentLon);


                mCurrentAccracy = location.getRadius();


                //查看缓存
                MyCurrentOrder currentOrder = new MyCurrentOrder(getApplicationContext());
                String itemId = currentOrder.getItemId();
                int state = currentOrder.getState();

                if ((!TextUtils.isEmpty(itemId)) && state == 2)
                {
                    MyApplication.isRecvingOrder = true;

                }
                else
                {
                    MyApplication.isRecvingOrder = false;
                    locationService.stop();
                    Log.i(TAG,"stop loc service in listener");
                }



                Intent msgIntent = new Intent(MyConstant.report_volunteer_location_action);

                if (isClickMyLoc ||( (!MyApplication.isRecvingOrder) && !isSkipFromTaskOrder) ) //如果是单击了我的位置 或者 第一次运行起来的地图（没有接单等操作），才把我的位置当做中心点
                {
                    msgIntent.putExtra("isCenterMyLoc",true);   //要求地图居中到我的位置
                    isClickMyLoc = false;
                }


                //暂时屏蔽Log.i(TAG, sb.toString());
                msgIntent.putExtra("lat",(mCurrentLat)); //纬度，经度
                msgIntent.putExtra("lng",(mCurrentLon));
                msgIntent.putExtra("accracy",mCurrentAccracy);
                (getApplicationContext()).sendBroadcast(msgIntent);


            }
        }

        public void onConnectHotSpotMessage(String s, int i){
        }
    };

    private void initBaiDu() {


        //获取locationservice实例，建议应用中只初始化1个location实例，然后使用，可以参考其他示例的activity，都是通过此种方式获取locationservice实例的
        mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);
        SDKInitializer.initialize(getApplicationContext());

        //自4.3.0起，百度地图SDK所有接口均支持百度坐标和国测局坐标，用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标，默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);

        /***
         * 初始化定位sdk，建议在Application中创建
         */
        locationService = new LocationService(getApplicationContext());
        locationService.setLocationOption(locationService.getDefaultLocationClientOption());
        locationService.registerListener(mListener);
    }

    public synchronized static MyApplication getInstance() {
        if (null == instance) { 
            instance = new MyApplication();
        } 
        return instance; 
    }


    // add Activity  
    public void addActivity(Activity activity) {

        activityArrayList.add(activity);
    } 
 
    public void exit() {
        Log.i(TAG,"exit()");
        try { 
            for (Activity activity : activityArrayList) {
                if (activity != null) 
                    activity.finish(); 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            //gxw-jpush会收不到System.exit(0);
        } 
    } 

    public void onLowMemory() {
        Log.i(TAG,"onLowMemory");
        super.onLowMemory();     
        System.gc(); 
    }
    /**
     * 初始化ImageLoader图片加载框架
     * @param context
     */
    public static void initImageLoader(Context context) {
        // 缓存文件的目录
        File cacheDir = StorageUtils.getOwnCacheDirectory(context,
                SD_PATH + "/helpu_image/");
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
                context)
                // 即保存的每个缓存文件的最大长宽
                // 线程池内加载的数量
                .memoryCacheExtraOptions(480, 800)
                .threadPriority(Thread.NORM_PRIORITY - 2)
                .denyCacheImageMultipleSizesInMemory()
                // 线程池内加载的数量
                .threadPoolSize(3)
                // 将保存的时候的URI名称用MD5 加密
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                // 你可以通过自己的内存缓存实现
                .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
                // 内存缓存的最大值
                .memoryCacheSize(2 * 1024 * 1024)
                // 50 Mb sd卡(本地)缓存的最大值
                .diskCacheSize(50 * 1024 * 1024)
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                // 由原先的discCache -> diskCache
                // 自定义缓存路径
                .diskCache(new UnlimitedDiskCache(cacheDir))
                // 5s,30s超时时间
                .imageDownloader(
                        new BaseImageDownloader(context, 5 * 1000, 30 * 1000))
                // Remove for release app
                .writeDebugLogs().build();
        // 全局初始化此配置
        ImageLoader.getInstance().init(config);
    }
    public static DisplayImageOptions options = new DisplayImageOptions.Builder()
           //gxw- .showImageOnLoading(R.mipmap.ic_launcher)
            // 设置图片下载期间显示的图片
           // gxw-.showImageForEmptyUri(R.mipmap.ic_launcher)
            // 设置图片Uri为空或是错误的时候显示的图片
            .showImageOnFail(R.mipmap.ic_launcher)
            // 设置图片加载或解码过程中发生错误显示的图片
           //gxw- .resetViewBeforeLoading(true)
            // 设置延迟部分时间才开始加载
            .imageScaleType(ImageScaleType.EXACTLY)
            // 设置图片的缩放方式
            .bitmapConfig(Bitmap.Config.RGB_565).considerExifParams(true)
            .cacheInMemory(true) // 设置下载的图片是否缓存在内存中
            .cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中
            .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
            .displayer(new FadeInBitmapDisplayer(500))
            .build();



    public static DisplayImageOptions optionsForPerson = new DisplayImageOptions.Builder()
            //gxw- .showImageOnLoading(R.mipmap.ic_launcher)
            // 设置图片下载期间显示的图片
            // gxw-.showImageForEmptyUri(R.mipmap.ic_launcher)
            // 设置图片Uri为空或是错误的时候显示的图片
            .showImageOnFail(R.drawable.default_head)
            // 设置图片加载或解码过程中发生错误显示的图片
            //gxw- .resetViewBeforeLoading(true)
            // 设置延迟部分时间才开始加载
            .imageScaleType(ImageScaleType.EXACTLY)
            // 设置图片的缩放方式
            .bitmapConfig(Bitmap.Config.RGB_565).considerExifParams(true)
            .cacheInMemory(true) // 设置下载的图片是否缓存在内存中
            .cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中
            .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
            .displayer(new FadeInBitmapDisplayer(500))
            .build();



    /**
     * 初始化OkHttpUtils图片加载框架
     */
    private  void initOkHttp() {
    /*  公共参数
        HttpHeaders headers = new HttpHeaders();
        headers.put("commonHeaderKey1", "commonHeaderValue1");    //所有的 header 都 不支持 中文
        headers.put("commonHeaderKey2", "commonHeaderValue2");
        HttpParams params = new HttpParams();
        params.put("commonParamsKey1", "commonParamsValue1");     //所有的 params 都 支持 中文
        params.put("commonParamsKey2", "这里支持中文参数");
     */

        //必须调用初始化
        OkHttpUtils.init(this);
        //以下都不是必须的，根据需要自行选择
        OkHttpUtils.getInstance()//
                .debug("OkHttpUtils")                                              //是否打开调试
                .setConnectTimeout(OkHttpUtils.DEFAULT_MILLISECONDS)               //全局的连接超时时间
                .setReadTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS)                  //全局的读取超时时间
                .setWriteTimeOut(OkHttpUtils.DEFAULT_MILLISECONDS)                //全局的写入超时时间
                .setCookieStore(new MemoryCookieStore())                          //cookie使用内存缓存（app退出后，cookie消失）
                .setCookieStore(new PersistentCookieStore());                       //cookie持久化存储，如果cookie不过期，则一直有效
        //GXW- .addCommonHeaders(headers)                                         //设置全局公共头
        //GXW-  .addCommonParams(params);
    }


}
